<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

require_once APPPATH . 'models/m_select.php';

/**
 * Модель выборки поиска по контентам
 *
 * @package CoreFramework
 * @version 1.0
 * @author Gennadiy Kozlenko
 */
class M_Search_Contents extends M_Select {
   
   /**
    * Поисковые термы
    *
    * @access private
    * @var array
    */
   var $_terms = array();
   
   /**
    * Количество символов в урезанном description
    *
    * @access private
    * @var integer
    */
   var $_limit_description = 200;
   
   /**
    * Количество символов в урезанном show_url
    *
    * @access private
    * @var integer
    */
   var $_limit_show_url = 100;
   
   /**
    * Конец урезанной строки
    * 
    * @access private
    * @var string
    */
   var $_end_char = '&#8230;';
   
   /**
    * Конструктор класса
    *
    * @access public
    * @return M_Search_Contents
    */
   function M_Search_Contents() {
      parent::M_Select();
      $this->load->helper('text');
      $this->load->model('m_content');
   } // end M_Search_Contents
   
   /**
    * Инициализация модельки
    *
    * @access public
    */
   function initialize() {
      // Часть запроса, вычисляющая релевантность
      $reg = mb_strtolower(implode('|', $this->_terms), $this->config->item('charset'));
      $search = "
         IF(LOWER(c.title) rlike " . $this->db->escape($reg) . ", 1, 0) +
         IF(LOWER(c.page_title) rlike " . $this->db->escape($reg) . ", 0.8, 0) +
         IF(LOWER(c.content) rlike " . $this->db->escape($reg) . ", 0.5, 0) +
         IF(LOWER(c.page_description) rlike " . $this->db->escape($reg) . ", 0.3, 0) +
         IF(LOWER(c.page_keywords) rlike " . $this->db->escape($reg) . ", 0.2, 0) +
         IF(LOWER(c.name) rlike " . $this->db->escape($reg) . ", 0.02, 0)
      ";
      // Устанавливаем запрос
      $sql = "
         SELECT
            c.id_content,
            c.title,
            '' AS url,
            '' AS show_url,
            c.content,
            c.name,
            " . $search . " AS weight
         FROM
            " . $this->db->dbprefix('contents') . " c
               INNER JOIN " . $this->db->dbprefix('menus') . " m USING (id_menu)
         WHERE
            c.status = 'active' AND
            m.status = 'active' AND
            " . $search . " > 0
         ORDER BY
            " . $search . " DESC,
            m.position,
            c.position
      ";
      parent::set_sql($sql);
   } // end initialize
   
   /**
    * Установка поисковых термов
    *
    * @access public
    * @param array $terms
    */
   function set_terms($terms) {
      $this->_terms = $terms;
   } // end set_terms
   
   /**
    * Получение поисковых термов
    *
    * @access public
    * @return array
    */
   function get_terms() {
      return $this->_terms;
   } // end get_terms
   
   /**
    * Получение результатов из базы
    * 
    * @see M_Select::load_results()
    * @return boolean
    */
   function load_results() {
      $this->clean_results();
      if (empty($this->_sql)) {
         return false;
      }
      // Выполняем запросы
      $query = $this->db->query($this->_sql);
      $this->_results = array();
      
      // Обрабатываем результаты
      $results = $query->result_array();
      $this->_process_results($results);
      foreach ($results as $result) {
         $this->_process_result($result);
         array_push($this->_results, $result);
      }
      $this->_all_count = count($this->_results);
      if (0 < $this->_limit_range) {
         $this->_results = array_slice($this->_results, $this->_start_range, $this->_limit_range);
      }
      return true;
   } // end load_results
   
   /**
    * Установка SQL запроса
    *
    * @access public
    * @param string $table
    */
   function set_sql($sql) {
      
   } // end set_sql
   
   /**
    * Установка сортировки
    *
    * @access public
    * @param string $field
    * @param boolean $forward
    * @return boolean
    */
   function add_sort($field, $forward = true) {
      
   } // end add_sort
   
   /**
    * Обработка результатов
    *
    * @access protected
    * @param array $results
    */
   function _process_results(&$results) {
      foreach ($results as $id => $result) {
         $this->m_content->set_id($result['id_content']);
         if ('active' == $this->m_content->get_status()) {
            $result['url'] = $this->m_content->get_url();
            $result['show_url'] = $result['url'];
            if ($this->_limit_show_url < strlen($result['show_url'])) {
               $result['show_url'] = substr($result['show_url'], 0, $this->_limit_show_url) . $this->_end_char;
            }
            $result['content'] = trim(character_limiter(preg_replace('~\s{2,}~', ' ', str_replace('&nbsp;', ' ', strip_tags($result['content']))), $this->_limit_description, $this->_end_char));
            $results[$id] = $result;
         } else {
            unset($results[$id]);
         }
      }
   } // end _process_results
   
}
